/*
 * Copyright (C) 2012 POAS.VSTU
 */

package model;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.TreeMap;

/**
 * Отбой
 */
public class CardPileRecycle extends CardPile {
    
    /**  Конструктор по-умолчанию. */
    public CardPileRecycle() { 
    }

    /**
     * Помещает 4 карты одного ранга в отбой.
     * @param cards карты, помещаемые в отбой
     */
    @Override
    public void push(List<Card> cards) {
        if (cards == null) {
            throw new NullPointerException("cards");
        }

        if (cards.size() != 4) {
            throw new IllegalArgumentException("cards");
        }
        
        Face face = cards.get(0).getFace();
        for (Card card : cards) {
            if (card.getFace() != face) {
                throw new IllegalArgumentException("Cards not the same rank");
            }
        }

        // один ранк и четыре разные масти
        List<Suit> suits = new ArrayList<>();
        for (Card card : cards) {
            Suit suit = card.getSuit();
            if (!suits.contains(suit)) suits.add(suit);
        }

        if (suits.size() != 4)
            throw new IllegalArgumentException("Suits are not different");

        mCards.addAll(cards);
    }
    
    public void sort() {
//        TreeMap<Face, Card> diamondsMap = new TreeMap<>();
//        TreeMap<Face, Card> clubsMap = new TreeMap<>();
//        TreeMap<Face, Card> heartsMap = new TreeMap<>();
//        TreeMap<Face, Card> spadesMap = new TreeMap<>();
//
//        for (Card card : mCards) {
//            switch (card.getSuit())
//            {
//                case SPADES:
//                    spadesMap.put(card.getFace(), card);
//                    break;
//
//                case DIAMONDS:
//                    diamondsMap.put(card.getFace(), card);
//                    break;
//
//                case CLUBS:
//                    clubsMap.put(card.getFace(), card);
//                    break;
//
//                case HEARTS:
//                    heartsMap.put(card.getFace(), card);
//                    break;
//            }
//        }
//
//        mCards = new ArrayList<>();
//
//        List<Card> tmpCards = new ArrayList<>();
//        for (Face face : diamondsMap.keySet()) {
//            tmpCards.add(diamondsMap.get(face));
//        }
//        Collections.reverse(tmpCards);
//        mCards.addAll(tmpCards);
//
//        tmpCards = new ArrayList<>();
//        for (Face face : spadesMap.keySet()) {
//            tmpCards.add(spadesMap.get(face));
//        }
//        Collections.reverse(tmpCards);
//        mCards.addAll(tmpCards);
//
//        tmpCards = new ArrayList<>();
//        for (Face face : clubsMap.keySet()) {
//            tmpCards.add(clubsMap.get(face));
//        }
//        Collections.reverse(tmpCards);
//        mCards.addAll(tmpCards);
//
//        tmpCards = new ArrayList<>();
//        for (Face face : heartsMap.keySet()) {
//           tmpCards.add(heartsMap.get(face));
//        }
//        Collections.reverse(tmpCards);
//        mCards.addAll(tmpCards);
    }

    /**
     * Возвращает ранг карт, находящихся в отбое.
     * @return ранг карт отбоя
     */
    public List<Face> getFaces() {
        List<Face> faces = new ArrayList<>();

        for (Card card : mCards) {
            Face cardFace = card.getFace();
            if (!faces.contains(cardFace)) faces.add(cardFace);
        }

        return faces;
    }
    
    /** Определяет наличие в отбое карт заданного ранга. */
    public boolean contains(Face face) {
        return this.getFaces().contains(face);
    }
}